function getChartType(char) {
  if (/^[\u4e00-\u9fa5]$/.test(char)) {
    return ['zh', 300];
  }
  if (/^[a-zA-Z]$/.test(char)) {
    return ['en', 200];
  }
  if (/^[0-9]$/.test(char)) {
    return ['number', 100];
  }
  return ['others', 999];
}

export function sortList(arr, attributes, isPositive) {
  if (Array.isArray(arr)) {
    arr.sort((item1, item2) => {
      if (!isPositive) {
        return getSortResult(item1[attributes], item2[attributes]);
      } else {
        return getSortResult(item2[attributes], item1[attributes]);
      }
    });
  } else {
    console.error('请传入一个数组对象');
  }
}

function getSortResult(str1, str2) {
  let res = 0;
  // 处理字符串为null的情况
  if (!str1 && !str2) {
    return 0;
  } else if (!!str1 && !str2) {
    return 1;
  } else if (!!str2 && !str1) {
    return -1;
  }
  str1 = str1.trim();
  str2 = str2.trim();
  for (let i = 0; ; i++) {
    if (!str1[i] || !str2[i]) {
      // 最终的终止条件
      res = str1.length - str2.length;
      break;
    }
    const char1 = str1[i];
    const char1Type = getChartType(char1);
    const char2 = str2[i];
    const char2Type = getChartType(char2);
    if (char1 === char2) {
      // 字符全等直接返回
      continue;
    }
    if (char1Type[0] !== char2Type[0]) {
      // 类型不同，按类型规则排序。数字（0->9）->字母（Aa->Zz）->中文拼音（a->z）
      res = char1Type[1] - char2Type[1];
    } else {
      if (char1Type[0] === 'zh') {
        res = char1.localeCompare(char2);
      } else if (char1Type[0] === 'en') {
        res = char1.toLocaleLowerCase().charCodeAt(0) - char2.toLocaleLowerCase().charCodeAt(0);
      } else if (char1Type[0] === 'number') {
        res = char1 - char2;
      } else {
        console.error('仅支持中文，数字和英文字符的排序');
      }
    }
    break;
  }
  return res;
}
